Software developers invest considerable resources in the development and maintenance of computer software. This investment often results in the development of proprietary algorithms that are advantageous over those used by the competition and which the developer would like to keep secret so as to leverage the superiority of the algorithm. In addition to proprietary algorithms, software may also contain other embedded secrets such as cryptographic keys. Because of the plethora of important information, software is often the target of various reverse engineering efforts to dissect, analyze, and discover how it works.
One approach frequently used by attackers to minimize the reverse engineering effort is to lift whole sections, such as individual functions, from a program. For example, if a program includes a function to decrypt a song prior to playback, instead of reverse engineering the decryption function, the attacker could simply call the decryption function providing the proper input parameters. Because this type of attack can be used to bypass media protection technologies, such as digital rights management technologies, software developers have used a variety of code obfuscation and anti-tamper techniques to thwart these reverse engineering attacks. Unfortunately, previous techniques have suffered from a number of drawback including code bloat, architecture specific solutions, and lack of stealth.